Spring Boot-এ WebClient ব্যবহার করে Asynchronous HTTP অনুরোধ প্রক্রিয়া করা হয়। এটি Spring WebFlux-এর অংশ এবং Mono ও Flux ব্যবহার করে রিয়্যাক্টিভ প্রোগ্রামিং এর সুবিধা প্রদান করে। WebClient Spring Boot ক্লায়েন্টে Non-blocking এবং Asynchronous API কল করতে ব্যবহৃত হয়।
Asynchronous Request Handling এর সুবিধা
- Non-blocking I/O:
- অনুরোধ পাঠানোর সময় থ্রেড ব্লক হয় না, ফলে অন্য কাজ একসাথে চালিয়ে যাওয়া যায়।
- Reactive Streams ব্যবহার:
- WebClient
MonoএবংFluxব্যবহার করে ডেটা প্রক্রিয়া করে।
- WebClient
- উচ্চতর পারফরম্যান্স:
- মাইক্রোসার্ভিস আর্কিটেকচারে একাধিক কল একসাথে পরিচালনা করার জন্য এটি কার্যকর।
প্রথমে প্রয়োজনীয় ডিপেন্ডেন্সি যোগ করা
Maven ডিপেন্ডেন্সি:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-webflux</artifactId>
</dependency>
উদাহরণ: WebClient দিয়ে Asynchronous Request Handling
১. WebClient Bean তৈরি করা
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.reactive.function.client.WebClient;
@Configuration
public class WebClientConfig {
@Bean
public WebClient.Builder webClientBuilder() {
return WebClient.builder();
}
}
২. Asynchronous GET অনুরোধ
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class UserClient {
private final WebClient webClient;
public UserClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://jsonplaceholder.typicode.com").build();
}
public Mono<String> getUserById(int userId) {
return webClient.get()
.uri("/users/{id}", userId)
.retrieve()
.bodyToMono(String.class);
}
}
ব্যবহার:
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.CommandLineRunner;
import org.springframework.stereotype.Component;
@Component
public class AppRunner implements CommandLineRunner {
@Autowired
private UserClient userClient;
@Override
public void run(String... args) {
userClient.getUserById(1).subscribe(response -> {
System.out.println("User Data: " + response);
});
}
}
৩. Asynchronous POST অনুরোধ
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Mono;
@Service
public class UserClient {
private final WebClient webClient;
public UserClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://jsonplaceholder.typicode.com").build();
}
public Mono<String> createUser(String name, String email) {
return webClient.post()
.uri("/users")
.bodyValue(new User(name, email))
.retrieve()
.bodyToMono(String.class);
}
}
ব্যবহার:
userClient.createUser("John Doe", "johndoe@example.com")
.subscribe(response -> {
System.out.println("Created User: " + response);
});
Model Class (User):
public class User {
private String name;
private String email;
public User(String name, String email) {
this.name = name;
this.email = email;
}
// Getters and Setters
}
৪. একাধিক Asynchronous কল একসাথে পরিচালনা করা
import org.springframework.stereotype.Service;
import org.springframework.web.reactive.function.client.WebClient;
import reactor.core.publisher.Flux;
@Service
public class UserClient {
private final WebClient webClient;
public UserClient(WebClient.Builder webClientBuilder) {
this.webClient = webClientBuilder.baseUrl("https://jsonplaceholder.typicode.com").build();
}
public Flux<String> getAllUsers() {
return webClient.get()
.uri("/users")
.retrieve()
.bodyToFlux(String.class);
}
}
ব্যবহার:
userClient.getAllUsers()
.subscribe(response -> {
System.out.println("User: " + response);
});
৫. Error Handling সহ Asynchronous কল
public Mono<String> getUserWithErrorHandling(int userId) {
return webClient.get()
.uri("/users/{id}", userId)
.retrieve()
.onStatus(
status -> status.is4xxClientError(),
response -> Mono.error(new RuntimeException("Client Error: " + response.statusCode()))
)
.onStatus(
status -> status.is5xxServerError(),
response -> Mono.error(new RuntimeException("Server Error: " + response.statusCode()))
)
.bodyToMono(String.class)
.doOnError(error -> System.err.println("Error occurred: " + error.getMessage()));
}
ব্যবহার:
userClient.getUserWithErrorHandling(999)
.subscribe(
response -> System.out.println("User: " + response),
error -> System.err.println("Error: " + error.getMessage())
);
ব্যাখ্যা: Reactive এবং Asynchronous Response
- Mono: একক ডেটার জন্য ব্যবহৃত হয়। উদাহরণ:
Mono<String>,Mono<User>. - Flux: একাধিক ডেটার জন্য ব্যবহৃত হয়। উদাহরণ:
Flux<User>. - subscribe(): এটি রেসপন্স প্রক্রিয়াকরণ শুরু করে এবং callback method ব্যবহার করে ডেটা হ্যান্ডেল করে।
উপসংহার
WebClient এর মাধ্যমে Asynchronous এবং Non-blocking HTTP কল করার সুবিধা হলো এটি Spring Boot অ্যাপ্লিকেশনে রিয়্যাক্টিভ প্রোগ্রামিং সরবরাহ করে। এটি মাইক্রোসার্ভিস আর্কিটেকচারে উচ্চতর পারফরম্যান্স এবং থ্রেড ব্যবস্থাপনায় সহায়তা করে। উদাহরণগুলো বাস্তবায়ন করলে ক্লায়েন্ট এবং সার্ভারের মধ্যে কার্যকর এবং স্কেলেবল যোগাযোগ নিশ্চিত হয়।
Read more